package com.learn.service.dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.hibernate.LockOptions;

/**
 *
 *
 * @param <T>
 */
public interface IBaseDao<T> {
	/**
	 * 保存一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void save(T o);

	/**
	 * 清除缓存 持久对象变成脱管对象
	 */
	public void evict(T o);

	/**
	 * 更新一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void update(T o);

	/**
	 * 保存或更新对象
	 * 
	 * @param o
	 *            对象
	 */
	public void saveOrUpdate(T o);

	/**
	 * 合并一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void merge(T o);

	/**
	 * 删除一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void delete(T o);

	/**
	 * 
	 * 刷新一个对象
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param o
	 * 
	 */
	public void refresh(T o);

	/**
	 * 查找对象集合
	 * 
	 * @param hql
	 * @param param
	 * @return List<T>
	 */
	public List<T> find(String hql, Object... param);

	/**
	 * 查找对象集合
	 * 
	 * @param hql
	 * @param param
	 * @return List<T>
	 */
	public List<T> find(String hql, List<Object> param);

	/**
	 * 查找对象集合,带分页，可输入一个带Collection型的参数，需要指定名称
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param hql
	 * @param param
	 * @return
	 * 
	 */
	public List<T> find(String hql, Map<String, Object> param);

	/**
	 * 查找对象集合,带分页
	 * 
	 * @param hql
	 * @param page
	 *            当前页
	 * @param rows
	 *            每页显示记录数
	 * @param param
	 * @return 分页后的List<T>
	 */
	public List<T> find(String hql, int page, int rows, List<Object> param);

	/**
	 * 查找对象集合,带分页
	 * 
	 * @param hql
	 * @param page
	 *            当前页
	 * @param rows
	 *            每页显示记录数
	 * @param param
	 * @return 分页后的List<T>
	 */
	public List<T> find(String hql, int page, int rows, Object... param);

	/**
	 * 查询序列
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param name
	 * @return
	 * 
	 */
	public BigDecimal findSequence(String name);

	/**
	 * 查找对象集合,带分页，可输入一个带Collection型的参数，需要指定名称
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param hql
	 * @param page
	 * @param rows
	 * @param param
	 * @return
	 * 
	 */
	public List<T> find(String hql, int page, int rows,
			Map<String, Object> param);

	/**
	 * 获得一个对象
	 * 
	 * @param c
	 *            对象类型
	 * @param id
	 * @return Object
	 */
	public T only(Class<T> c, Serializable id);

	/**
	 * 获得一个对象
	 * 
	 * @param hql
	 * @param param
	 * @return Object
	 */
	public T only(String hql, Object... param);

	/**
	 * 获得一个对象
	 * 
	 * @param hql
	 * @param param
	 * @return Object
	 */
	public T only(String hql, List<Object> param);

	/**
	 * id查询，并锁定数据
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param c
	 * @param id
	 * @return
	 * 
	 */
	public T onlyAndLock(Class<T> c, Serializable id);

	/**
	 * id查询，并锁定数据
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param c
	 * @param id
	 * @param opt
	 * @return
	 * 
	 */
	public T onlyAndLock(Class<T> c, Serializable id, LockOptions opt);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @param param
	 * @return Long
	 */
	public Long count(String hql, Object... param);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @param param
	 * @return Long
	 */
	public Long count(String hql, List<Object> param);

	/**
	 * 记录条数，带in (?)的查询条件
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param hql
	 * @param param
	 * @return
	 * 
	 */
	public Long count(String hql, Map<String, Object> param);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @return 相应数目
	 */
	public Integer executeHql(String hql);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeHql(String hql, Object... param);

	/**
	 * 执行HQL语句（源生）
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param hql
	 * @param param
	 * @return Query.uniqueResult()
	 * 
	 */
	public Object executeHqlOrigin(String hql, Object... param);

	/**
	 * 执行SQL语句
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param sql
	 * @param param
	 * @return SQLQuery.uniqueResult()
	 * 
	 */
	public Object executeSQL(String sql, Object... param);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeHql(String hql, List<Object> param);

	/**
	 * 执行HQL语句,带in (?)的查询条件
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param hql
	 * @param param
	 * @return
	 * 
	 */
	public Integer executeHql(String hql, Map<String, Object> param);

	/**
	 * SQL查询语句
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param sql
	 * @param cls
	 * @param param
	 * @return
	 * 
	 */
	public List<T> findSql(String sql, Class<T> cls, List<Object> param);

	/**
	 * SQL查询记录总数
	 * 
	 * @author：liangan
	 *
	 * 
	 * @param sql
	 * @param cls
	 * @param param
	 * @return
	 * 
	 */
	public Long countSql(String sql, Class<T> cls, List<Object> param);

}
